/*
 * scala-swing (https://www.scala-lang.org)
 *
 * Copyright EPFL, Lightbend, Inc., contributors
 *
 * Licensed under Apache License 2.0
 * (http://www.apache.org/licenses/LICENSE-2.0).
 *
 * See the NOTICE file distributed with this work for
 * additional information regarding copyright ownership.
 */

package scala.swing.examples

import scala.swing.*

object Dialogs extends SimpleSwingApplication:

    import TabbedPane.*

    lazy val label = new Label("No Result yet")
    lazy val tabs = new TabbedPane:
        pages += new Page("File",
            new GridBagPanel:
                grid =>
                import GridBagPanel.*

                val buttonText = new TextField("Click Me")

                val c = new Constraints
                c.fill = Fill.Horizontal
                c.grid = (1, 1)

                val chooser = new FileChooser
                layout(new Button(Action("Open") {
                    chooser.showOpenDialog(grid)
                })) = c

                c.grid = (1, 2)
                layout(new Button(Action("Save") {
                    chooser.showSaveDialog(grid)
                })) = c

                c.grid = (1, 3)
                layout(new Button(Action("Custom") {
                    chooser.showDialog(grid, buttonText.text)
                })) = c

                c.grid = (2, 3)
                layout(new Label("  with Text  ")) = c

                c.grid = (3, 3)
                c.ipadx = 50
                layout(buttonText) = c

                border = Swing.EmptyBorder(5, 5, 5, 5)
        )
        pages += new Page("Simple Modal Dialogs",
            new BorderPanel:

                import BorderPanel.*

                val mutex  = new ButtonGroup
                val ok     = new RadioButton("OK (in the L&F's words)")
                val ynlf   = new RadioButton("Yes/No (in the L&F's words)")
                val ynp    = new RadioButton("Yes/No (in the programmer's words)")
                val yncp   = new RadioButton("Yes/No/Cancel (in the programmer's words)")
                val radios = List(ok, ynlf, ynp, yncp)
                mutex.buttons ++= radios
                mutex.select(ok)
                val buttons = new BoxPanel(Orientation.Vertical):
                    contents ++= radios
                layout(buttons) = Position.North
                layout(new Button(Action("Show It!") {
                    import Dialog.*
                    mutex.selected.get match
                        case `ok` =>
                            showMessage(buttons, "Eggs aren't supposed to be green.")
                        case `ynlf` =>
                            label.text = showConfirmation(buttons,
                                "Would you like green eggs and ham?",
                                "An Inane Question") match
                                case Result.Yes => "Ewww!"
                                case Result.No  => "Me neither!"
                                case _          => "Come on -- tell me!"
                        case `ynp` =>
                            val options = List("Yes, please",
                                "No, thanks",
                                "No eggs, no ham!")
                            label.text = showOptions(buttons,
                                "Would you like some green eggs to go with that ham?",
                                "A Silly Question",
                                entries = options,
                                initial = 2) match
                                case Result.Yes => "You're kidding!"
                                case Result.No  => "I don't like them, either."
                                case _          => "Come on -- 'fess up!"
                        case `yncp` =>
                            val options = List("Yes, please",
                                "No, thanks",
                                "No eggs, no ham!")
                            label.text = showOptions(buttons,
                                message = "Would you like some green eggs to go with that ham?",
                                title = "A Silly Question",
                                entries = options,
                                initial = 2) match
                                case Result.Yes    => "Here you go: green eggs and ham!"
                                case Result.No     => "OK, just the ham, then."
                                case Result.Cancel => "Well, I'm certainly not going to eat them!"
                                case _             => "Please tell me what you want!"
                    end match
                })) = Position.South
        )
        pages += new Page("More Dialogs",
            new BorderPanel:

                import BorderPanel.*

                val mutex       = new ButtonGroup
                val pick        = new RadioButton("Pick one of several choices")
                val enter       = new RadioButton("Enter some text")
                val custom      = new RadioButton("Custom")
                val customUndec = new RadioButton("Custom undecorated")
                val custom2     = new RadioButton("2 custom dialogs")
                val radios      = List(pick, enter, custom, customUndec, custom2)
                mutex.buttons ++= radios
                mutex.select(pick)
                val buttons = new BoxPanel(Orientation.Vertical):
                    contents ++= radios
                layout(buttons) = Position.North
                layout(new Button(Action("Show It!") {
                    import Dialog.*
                    mutex.selected.get match
                        case `pick` =>
                            val possibilities = List("ham", "spam", "yam")
                            val s = showInput(buttons,
                                "Complete the sentence:\n\"Green eggs and...\"",
                                "Customized Dialog",
                                Message.Plain,
                                Swing.EmptyIcon,
                                possibilities, "ham")

                            // If a string was returned, say so.
                            label.text = if s.isDefined && (s.get.length > 0) then
                                "Green eggs and... " + s.get + "!"
                            else
                                "Come on, finish the sentence!"
                        case `enter` =>
                            val s = showInput(buttons,
                                "Complete the sentence:\n\"Green eggs and...\"",
                                "Customized Dialog",
                                Message.Plain,
                                Swing.EmptyIcon,
                                Nil, "ham")

                            // If a string was returned, say so.
                            label.text = if s.isDefined && (s.get.length > 0) then
                                "Green eggs and... " + s.get + "!"
                            else
                                "Come on, finish the sentence!"
                        case `custom` =>
                            val dialog = new Dialog(top)
                            dialog.open()
                            dialog.contents = Button("Close Me!") {
                                dialog.close()
                            }
                        case `customUndec` =>
                            val dialog = new Dialog with RichWindow.Undecorated
                            dialog.open()
                            dialog.contents = Button("Close Me!") {
                                dialog.close()
                            }
                        case `custom2` =>
                            val d1 = new Dialog
                            val d2 = new Dialog(d1)
                            d1.open()
                            d2.open()
                            d1.contents =
                                Button("Close Me! I am the owner and will automatically close the other one") {
                                    d1.close()
                                }
                            d2.contents = Button("Close Me!") {
                                d2.close()
                            }
                    end match
                })) = Position.South
        )

    lazy val ui: Panel = new BorderPanel:
        layout(tabs) = BorderPanel.Position.Center
        layout(label) = BorderPanel.Position.South

    lazy val top: Frame = new MainFrame:
        title = "Dialog Demo"
        contents = ui
end Dialogs
